package br.com.saeng2D.objeto.animado;

import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.io.PrintWriter;

import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.util.P2D;
import br.com.saeng2D.util.Vetor;

//Um objeto que pode rotacionar
public abstract class AbstratoAnimado extends AbstratoObjeto {
	protected VetorAnimado[] vetores;
	protected Associacao[] associacoes;
	protected VetorAnimado vetorReferencia;

	public AbstratoAnimado(String descricao, int x, int y) {
		super(null, descricao, x, y, 0, 0);
		if(descricao == null) {
			throw new RuntimeException();
		}
	}
	
	public void salvarXML(String prefixo, PrintWriter pw) {
		pw.print(prefixo + "\t<" + descricao + " x=\"" + x + "\" y=\"" + y + "\" q=\"" + vetores.length + "\" vetores=\"" + vetores() + "\"/>\r\n");
	}
	
	public final void restaurar(int q, String stringVetores) {
		vetores = new VetorAnimado[q];
		String[] strings = stringVetores.split("@");
		int i = 0;
		for(String s : strings) {
			String[] sv = s.split(";");
			float x = Float.parseFloat(sv[0]);
			float y = Float.parseFloat(sv[1]);
			boolean visivel = Boolean.parseBoolean(sv[2]);
			boolean referencia = Boolean.parseBoolean(sv[3]);
			vetores[i] = new VetorAnimado(x, y, visivel, referencia);
			i++;
		}
		reassociar();
	}
	
	protected String vetores() {
		StringBuilder sb = new StringBuilder();
		for(VetorAnimado v : vetores) {
			sb.append("" + v.x + ";" + v.y + ";" + v.visivel + ";" + v.referencia + "@");
		}
		sb.delete(sb.length()-1, sb.length());
		return sb.toString();
	}

	public abstract void inicializacao();
	
	public abstract void reassociar();
	
	public void alterarTamanho(int tamanho) {
		for(VetorAnimado v : vetores) {
			v.alterarTamanho(tamanho);
		}
	}
	
	public void rotacionar(int grau) {
		for(Vetor v : vetores) {
			v.rotacionar(grau);
		}
	}

	public void desenhar(Graphics2D g2, Associacao a) {
		desenhar(g2, a.vetor1, a.vetor2);
	}
	
	public void desenhar(Graphics2D g2, Vetor vetor) {
		g2.draw(new Line2D.Float(x, y, x + vetor.x, y - vetor.y));
	}	

	public void desenhar(Graphics2D g2, Vetor vetor1, Vetor vetor2) {
		g2.draw(new Line2D.Float(x + vetor1.x, y - vetor1.y, x + vetor2.x, y - vetor2.y));
	}
	
	public Vetor getVetorReferencia() {
		return vetorReferencia;
	}
	
	public P2D getP2DVetorReferencia() {
		return new P2D((int)(x + vetorReferencia.x), (int)(y + vetorReferencia.y * -1));
	}
}